      <h1 class="entry-title entry-title-single" itemprop="headline">ABAP 开发系列(04): ABAP数据类型与数据对象</h1>

    <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
      <p><span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span> Programming Language 的内容主要有：</p>
<p>1.数据类型与数据对象</p>
<p>2.内表和内表结构（Internal Table）</p>
<p>3.数据流控制语句</p>
<p>4.模块化（Modularization）</p>
<p>&nbsp;<br />
<span id="more-177"></span><br />
<b>1.</b><b>数据类型与数据对象</b></p>
<p><b>1.1 <span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span></b><b>元素数据类型</b></p>
<p><span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span>元素数据基本类型有以下8种：</p>
<table width="60%" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="144"><b>类型</b></td>
<td valign="top" width="144"><b>描述</b></td>
<td valign="top" width="144"><b>长度</b></td>
<td valign="top" width="144"><b>标准长度</b></td>
</tr>
<tr>
<td valign="top" width="144">C</td>
<td valign="top" width="144">字符</td>
<td valign="top" width="144">1-65365字符</td>
<td valign="top" width="144">1位字符</td>
</tr>
<tr>
<td valign="top" width="144">N</td>
<td valign="top" width="144">数字文本</td>
<td valign="top" width="144">1-65365字符</td>
<td valign="top" width="144">1位字符</td>
</tr>
<tr>
<td valign="top" width="144">I</td>
<td valign="top" width="144">整型</td>
<td valign="top" width="144">4 位</td>
<td valign="top" width="144"></td>
</tr>
<tr>
<td valign="top" width="144">P</td>
<td valign="top" width="144">包</td>
<td valign="top" width="144">1-16位</td>
<td valign="top" width="144">8位</td>
</tr>
<tr>
<td valign="top" width="144">F</td>
<td valign="top" width="144">浮点型</td>
<td valign="top" width="144">8 位</td>
<td valign="top" width="144"></td>
</tr>
<tr>
<td valign="top" width="144">D</td>
<td valign="top" width="144">日期类型</td>
<td valign="top" width="144">8位字符</td>
<td valign="top" width="144"></td>
</tr>
<tr>
<td valign="top" width="144">T</td>
<td valign="top" width="144">时间类型</td>
<td valign="top" width="144">6位字符</td>
<td valign="top" width="144"></td>
</tr>
<tr>
<td valign="top" width="144">X</td>
<td valign="top" width="144">十六进制</td>
<td valign="top" width="144">1位</td>
<td valign="top" width="144"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>其中：</p>
<p>C 和 N 为字符类型，N 为数字文本，如果定义的位数为4位，但是数据只有两位时，会补上前置零，例如：0020.</p>
<p>I、P、F为数字类型，I 为整型，P 和 F 都为浮点数，只是P的精确度比 F 高，故用 P 类型频率会比 F 类型高。</p>
<p>ABAP 中的日期和时间，分属不同类型，分别是 D 和 T ，然后在显示时，字符间中间不带任何格式符；</p>
<p>例如，日期：20140224，时间：120535。</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000;"><em>提示：内部显示和外部显示</em></span></p>
<p><em>在 <span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap" title="SAP" target="_blank">SAP</a></span> 数据字典中，显示的数据需要区分内部显示和外部显示。</em></p>
<p><em>外部显示就是我们在屏幕上看到的数据；</em></p>
<p><em>内部显示则是系统内部操作的数据。</em></p>
<p><em>例如：</em></p>
<p><em><strong> N 类型</strong>：0020，外部显示就是20，而内部显示则是0020；</em></p>
<p><em><strong>日期类型</strong>：2014-02-24，外部显示为2014.02.24(根据<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap" title="SAP" target="_blank">SAP</a></span>用户日期格式设置显示)，而内部显示则是20140224.</em></p>
<p>&nbsp;</p>
<p><b>1.2 变量的定义</b></p>
<p><b>1.2.1 通过类型定义</b></p>
<p>语法：</p>
<p><span style="color: #ff0000; background-color: #fff000;"><strong>DATA   &lt;Name&gt; (&lt;length&gt;) TYPE  &lt;data type&gt; VALUE &lt;default&gt;.</strong></span></p>
<p>通过<b>Data</b>关键字声明变量，如若需要定义多个变量时，可用在Data 关键字后加上冒号“:”.</p>
<p>例如：</p>
<pre class="brush: abap;">
* 定义单个变量：
DATA Person(35) TYPE C.

* 定义多个变量：
DATA:  Player(35)  TYPE C,
       NickName(35),
       Points	   TYPE I,
       Games       TYPE I  VALUE '10',
       Average(5)  TYPE P,
       Starter,
       Acquired	   TYPE D.
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>1.2.2 </b><b>初始值</b></p>
<p>在 ABAP 的8种基本类型中，每个类型都有其初始值。</p>
<p>在定义变量时，如果没有设置其默认值，或者使用<b>CLEAR</b> 语法清除变量时，系统都会将其恢复成初始值。</p>
<p>每个类型的初始值如下表所示：</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="144"><b>类型</b></td>
<td valign="top" width="144"><b>初始值</b></td>
<td valign="top" width="144"><b>类型</b></td>
<td valign="top" width="144"><b>初始值</b></td>
</tr>
<tr>
<td valign="top" width="144">C</td>
<td valign="top" width="144">(blank)</td>
<td valign="top" width="144">N</td>
<td valign="top" width="144">zeroes</td>
</tr>
<tr>
<td valign="top" width="144">I</td>
<td valign="top" width="144">zero</td>
<td valign="top" width="144">D</td>
<td valign="top" width="144">00000000</td>
</tr>
<tr>
<td valign="top" width="144">P</td>
<td valign="top" width="144">zero</td>
<td valign="top" width="144">T</td>
<td valign="top" width="144">000000</td>
</tr>
<tr>
<td valign="top" width="144">F</td>
<td valign="top" width="144">zeroes</td>
<td valign="top" width="144">X</td>
<td valign="top" width="144">00</td>
</tr>
</tbody>
</table>
<p>在定义变量时，可以通过分配默认值，来初始化变量：</p>
<pre class="brush: abap;">
DATA:  Player(35)  TYPE C ,
       NickName(35)   VALUE 'Dr.J',
       Points      TYPE I,
       Games       TYPE I VALUE '10',
       Average(5)  TYPE P VALUE 10,
       Starter     VALUE 'Yes',
       Acquired    TYPE D VALUE '20100101'.
</pre>
<p>&nbsp;<br />
使用CLEAR语法，则会将变量恢复回初始值(上表所示)。如：</p>
<pre class="brush: abap;">
* 清除单个变量
   CLEAR  NickName.

* 清除多个变量
   CLEAR: Points, Games, Average.
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>1.2.3 </b><b>通过参考值定义(LIKE 语法)</b></p>
<p>ABAP可以通过现有的类型，通过<b>LIKE</b>关键字，将已定义好的变量作为参考类型，作为新定义变量的类型。</p>
<p>语法：<br />
<span style="color: #ff0000; background-color: #fff000;"><strong><br />
DATA  &lt;Name1&gt; LIKE  &lt;Name2&gt; VALUE &lt;default&gt;.<br />
</strong></span></p>
<p>如：</p>
<pre class="brush: abap;">DATA: Player(35) TYPE C  VALUE 'Julius Erving',
      Nickname(35),
      Acquired   TYPE D.
</pre>
<p>使用LIKE定义同样类型的变量：</p>
<pre class="brush: abap;">DATA: Player(35) TYPE C VALUE 'Julius Erving',
      Nickname   LIKE PLAYER,
      Acquired   LIKE SY-DATUM.
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>1.3 </b><b>定义常量</b></p>
<p>语法：<br />
<span style="color: #ff0000; background-color: #fff000;"><strong><br />
CONSTANTS  &lt;name&gt;(&lt;length&gt;) TYPE &lt;data type&gt; VALUE &lt;value&gt;.<br />
</strong></span></p>
<p>通过关键字<b>CONSTANTS</b> 声明定义常量，与变量一样，区别在于：</p>
<p>常量定义时，必须分配默认值，且常量不能在程序中修改。</p>
<pre class="brush: abap;">
CONSTANTS: TEAM1(20) TYPE C     VALUE '76ers',
           TEAM2     LIKE TEAM1 VALUE 'Celtics',
           TOT_GAMES TYPE I     VALUE 82.
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>1.4 </b><b>自定义类型</b></p>
<p>上面提到，ABAP中有8种基本类型，ABAP也允许用户自定义类型，便于维护操作。</p>
<p>例如，不同字节长度字符串用途不同，如果需要定义不同的长度的C类型来操作，就可以通过自定义类型实现。</p>
<p>语法：</p>
<p><span style="color: #ff0000; background-color: #fff000;"><strong><br />
TYPES  &lt;name&gt;(&lt;length&gt;) TYPE &lt;data type&gt;.<br />
</strong></span></p>
<p>通过关键字 <b>TYPES</b>，自定义相关类型，然后在定义声明变量时，使用自定义的类型作为变量类型：</p>
<pre class="brush: abap;">* 自定义类型
TYPES:  NAME(35)  TYPE C,
        TEAMS(20) TYPE C.

* 使用自定义类型作为变量类型
DATA: PLAYER   TYPE NAME   VALUE 'Troy Aikman',
      NICKNAME LIKE PLAYER.

* 使用自定义类型作为常量类型
CONSTANTS: TEAM1  TYPE TEAMS VALUE 'Cowboys',
           TEAM2  LIKE TEAM1 VALUE 'Packers'.</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>1.5 </b><b>数据输出</b></p>
<p><b>1.5.1 </b><b>数据基本输出</b></p>
<p>ABAP 8种基本类型的标准输出长度及输出对齐方式，如下表所示：</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="144">类型</td>
<td valign="top" width="144">输出标准长度</td>
<td valign="top" width="144">对齐方式</td>
</tr>
<tr>
<td valign="top" width="144">C</td>
<td valign="top" width="144">自定义长度</td>
<td valign="top" width="144">左对齐</td>
</tr>
<tr>
<td valign="top" width="144">I</td>
<td valign="top" width="144">12位</td>
<td valign="top" width="144">右对齐</td>
</tr>
<tr>
<td valign="top" width="144">P</td>
<td valign="top" width="144">(2 * 自定义长度 + )1</td>
<td valign="top" width="144">右对齐</td>
</tr>
<tr>
<td valign="top" width="144">F</td>
<td valign="top" width="144">22位</td>
<td valign="top" width="144">右对齐</td>
</tr>
<tr>
<td valign="top" width="144">N</td>
<td valign="top" width="144">自定义长度</td>
<td valign="top" width="144">左对齐</td>
</tr>
<tr>
<td valign="top" width="144">D</td>
<td valign="top" width="144">10位</td>
<td valign="top" width="144">左对齐</td>
</tr>
<tr>
<td valign="top" width="144">T</td>
<td valign="top" width="144">8位</td>
<td valign="top" width="144">左对齐</td>
</tr>
<tr>
<td valign="top" width="144">X</td>
<td valign="top" width="144">(2*自定义长度)</td>
<td valign="top" width="144">左对齐</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>通过<b>WRITE</b>关键词输出多个数据对象，然后通过反斜杠”/“ 进行换行输出：</p>
<pre class="brush: abap;">
DATA: FLOAT TYPE F VALUE ‘98.7654321E2’,
      PACK  TYPE P VALUE 12,
      INT   TYPE I VALUE 32.

WRITE FLOAT.			 "单独输出一个变量

WRITE:	/ FLOAT,		 "输出多个变量
        / FLOAT EXPONENT 1  DECIMALS 3,	  "通过科学计数法并保留3位小数输出
        / FLOAT EXPONENT 0  DECIMALS 2,
        / PACK,
        / PACK DECIMALS 1,	 "保留1位小数点输出
        / INT DECIMALS 2.	 "保留2位小数点输出</pre>
<p>输出结果：</p>
<p><strong>9.876543210000000E+03</strong></p>
<p><strong>987.654E+01</strong></p>
<p><strong>9876.54</strong></p>
<p><strong>12</strong></p>
<p><strong>12.0</strong></p>
<p><strong>32.00</strong></p>
<p>&nbsp;</p>
<p><b>1.6 定义指针变量</b></p>
<p>ABAP中存在指针变量，指针变量定义后，不是通过变量来保存值，而是通过指针给变量分配源字段的内存地址。</p>
<p>一般多用于在与大量数据交互操作时，优化程序性能。</p>
<p>语法：<br />
<span style="color: #ff0000; background-color: #fff000;"><strong><br />
FIELD-SYMBOLS: &lt;&lt;name&gt;&gt; TYPE &lt;data type&gt;.<br />
FIELD-SYMBOLS: &lt;&lt;name1&gt;&gt; LIKE &lt;name2&gt;.<br />
</strong></span></p>
<p>通过关键字 <b>ASSIGN</b> 为指针分配值:</p>
<pre class="brush: abap;">
DATA:  NUM TYPE I VALUE 12.

FIELD-SYMBOLS: 
    <F1>,
    <F2> TYPE I,
    <F3> LIKE NUM.

ASSIGN:	
    NUM TO <F1>,
    NUM TO <F2>,
    NUM TO <F3>.

WRITE: / ‘Line 1:’, NUM, <F1>, <F2>, <F3>.

 <F1> = 32.

WRITE: / ‘Line 2:’, NUM, <F1>, <F2>, <F3>.
</pre>
<p>输出结果：<br />
<strong>Line 1: 12         12     12     12</strong></p>
<p><strong>Line 2: 32         32     32     32</strong></p>
<p>&nbsp;</p>
<p>需要注意的是，如若没有对指针分配值，却使用该指针时，语法检查时，可以通过；</p>
<p>但在运行程序时，会出现 <span style="color: #ff0000;"><strong>Runtime Error </strong></span>的错误。</p>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;</p>